# 名称                                   说明
# SQLALCHEMY_DATABASE_URL               用于链接的数据库URL："mysql://用户名:密码@数据库服务地址:端口号/数据库"
# SQLALCHEMY_BINDS                      一个映射binds到链接URL的字典， 更多binds的信息见Binds操作多个数据库 ---- 连接多个数据库
# SQLALCHEMY_ECHO                       如果设置为True，SQLALchemy会记录所有发给stderr的语句，这对调试有用（打印sql语句）
# SQLALCHEMY_RECORD_QUERIES             可以用于显式的禁用或启用查询记录。查询记录在调试或测试模式自动启用
# SQLALCHEMY_NATIVE_UNICODE             可以用于显式禁用原生unicode支持。当使用不合适的指定无编码的数据库默认值时， 这对于
#                                       一些数据库适配器时必须的
# SQLALCHEMY_POOL_SIZE                  数据库链接池的大小。默认时引擎默认值（通常是5）
# SQLALCHEMY_POOL_TIMEOUT               设定链接池的连接超时时间，默认是10
# SQLALCHEMY_POOL_RECYCLE               多少秒自动回连连接。对MYsql是必要的。它默认移除闲置多余8小时的连接，注意如果使用了
#                                       MYSQL， Flask-SQLALchemy自动设定这个值为2小时



# 导入flask类
# render_template 从 jinjia2的库自动带的
from flask import Flask, request, render_template
from datetime import datetime
# pymysql 连接数据库的驱动, SQLAlchemy 类似jdbc可以简单的操作数据库
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = "root"
DATABASE = "PearAdminFlask"
app.config["SQLALCHEMY_DATABASE_URI"] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"

# SQLAlchemy 会自动的读取confg中的配置信息
db = SQLAlchemy(app)

# 二、SQLAlchemy常用数据类型
# 1. Integer：整形，映射到数据库中是int类型。
# 2. Float：浮点类型，映射到数据库中是float类型。他占据的32位。
# 3. Double：双精度浮点类型，映射到数据库中是double类型，占据64位 (SQLALCHEMY中没有)。
# 4. String：可变字符类型，映射到数据库中是varchar类型.
# 5. Boolean：布尔类型，映射到数据库中的是tinyint类型。
# 6. DECIMAL：定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储钱相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数，第一个参数是用来标记这个字段总能能存储多少个数字，第二个参数表示小数点后有多少位。
# 例如：sal = db.Column(name='sal', type_=DECIMAL(10, 2))
# 7. Enum：枚举类型。指定某个字段只能是枚举中指定的几个值，不能为其他值。在ORM模型中，使用Enum来作为枚举。
# 8. Date：存储时间，只能存储年月日。映射到数据库中是date类型。在Python代码中，可以使用datetime.date来指定。
# 9. DateTime：存储时间，可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中，可以使用datetime.datetime来指定。
# 10. Time：存储时间，可以存储时分秒。映射到数据库中也是time类型。在Python代码中，可以使用datetime.time来创建值。
# 10. Text：存储长字符串。一般可以存储6W多个字符。如果超出了这个范围，可以使用LONGTEXT类型。映射到数据库中就是text类型。
# 11. LONGTEXT：长文本类型，映射到数据库中是longtext类型。这个类型属于Mysql方言里面的

class News(db.Model):
    __tablename__ = 't_news'
    id = db.Column(type_=db.Integer, primary_key=True, autoincrement=True)
    price1 = db.Column(type_=db.Float)  # 存储数据时存在精度丢失问题
    price2 = db.Column(type_=db.DECIMAL(10, 4))
    title = db.Column(type_=db.String(50))
    is_delete = db.Column(type_=db.Boolean)
    tag1 = db.Column(db.Enum('PYTHON', 'FLASK', 'DJANGO'))  # 枚举常规写法
    tag2 = db.Column(db.Enum(db.TagEnum))  # 枚举的另一种写法,但是需要定义一个类，类中定义一些需要的属性
    create_time1 = db.Column(type_=db.Date)
    create_time2 = db.Column(type_=db.DateTime)
    create_time3 = db.Column(type_=db.Time)
    content1 = db.Column(type_=db.Text)
    content2 = db.Column(type_=db.LONGTEXT)


# 三、db.Column常用参数
# 1. primary_key：True设置某个字段为主键。
# 2. autoincrement：True设置这个字段为自动增长的。
# 3. default：设置某个字段的默认值。在发表时间这些字段上面经常用。
# 4. nullable：指定某个字段是否为空。默认值是True，就是可以为空。
# 5. unique：指定某个字段的值是否唯一。默认是False。
# 6. onupdate：在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候，不会用onupdate的值，只会使用default的值。常用于是update_time字段（每次更新数据的时候都要更新该字段值）。
# 7. name：指定ORM模型中某个属性映射到表中的字段名。如果不指定，那么会使用这个属性的名字来作为字段名。如果指定了，就会使用指定的这个值作为表字段名。这个参数也可以当作位置参数，在第1个参数来指定。


class New(db.Model):
    __tablename__='t_news1'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True) #自增主键
    create_time = db.Column(db.DateTime,default=11)                  #设置某个字段的默认值。在发表时间这些字段上面经常用。
    title = db.Column(db.String(50), name='my_title', nullable=False) #指定某个字段是否为空。nullable=False,表示不能为空
    telephone = db.Column(db.String(11), unique=True)                 #指定某个字段的值是否唯一。unique=True：表示唯一
    update_time = db.Column(db.DateTime, onupdate=datetime.now, default=datetime.now) #在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候

